www.gusucode.com > VC++ ASP文件上传组件源代码+调用示例-源码程序 > VC++ ASP文件上传组件源代码+调用示例-源码程序/code/aspup_src/MyRequest/Parser.cpp

    //Download by http://www.NewXing.com
// Parser.cpp: implementation of the CSafeArrayParser class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Parser.h"
#include "Form.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CParser::CParser(CBuffer bRequest, CBuffer bBoundry)
{
	m_bRequest = bRequest;
	m_bBoundry = bBoundry;
}

HRESULT CParser::Parse(CForm* pForm)
{
	int nPos = NextBoundry(0);
	int i = nPos + m_bBoundry.m_nSize;
	while(m_bRequest.m_lpBuffer[i] != '-') {
		i += 2;
		nPos = NextBoundry(i);
		if(nPos == -1) return E_FAIL;

		CBuffer bItem = m_bRequest.subBuffer(nPos - i - 2, i);
		ParseItem(bItem, pForm);
		i = nPos + m_bBoundry.m_nSize;
	}
	return S_OK;
}

int CParser::NextBoundry(int nPos)
{
	CBuffer bTemp;
	do {
		nPos = m_bRequest.find("--", nPos);
		if(nPos == -1) return -1;
		nPos += 2;
		bTemp = m_bRequest.subBuffer(m_bBoundry.m_nSize, nPos);
	} while(bTemp != m_bBoundry);
	return nPos;
}

BYTE lpCRLF2[4] = { 0x0d, 0x0a, 0x0d, 0x0a };
void CParser::ParseItem(CBuffer bItem, CForm *pForm)
{
	CBuffer bCRLF2(lpCRLF2, 4);
	int i = bItem.find(bCRLF2);
	CBuffer bHeader = bItem.subBuffer(i);

	int nLen = bItem.m_nSize - i - 6;
	CBuffer bBody = bItem.subBuffer(nLen, i+4);

	i = bHeader.find("name=\"");
	i += 6;	// length of [name="]
	int j = bHeader.find("\"", i);
	CBuffer bName = bHeader.subBuffer(j - i, i);
	CComBSTR bstrName = bName;

	BOOL bFile = FALSE;
	CComBSTR bstrFileName = _T("");
	CComBSTR bstrCType = _T("");

	i = bHeader.find("filename=\"", j+1);
	if(i != -1) {
		i += 10; // length of [filename="]
		bFile = TRUE;
		int j = bHeader.find("\"", i);
		CBuffer bFileName = bHeader.subBuffer(j - i, i);
		bstrFileName = bFileName;

		i = bHeader.find("Content-Type: ", j+1);
		i += 14; // length of [Content-Type: ]
		j = bHeader.m_nSize;
		CBuffer bCType = bHeader.subBuffer(j - i, i);
		bstrCType = bCType;
	}
	
	pForm->AddItem(bstrName, bstrFileName, bstrCType, bBody, bFile);
}